/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Rob
 */
@Stateless
public class ArticoloUsatoFacade extends AbstractFacade<ArticoloUsato> implements ArticoloUsatoFacadeLocal {
    
    @PersistenceContext(unitName = "EnterpriseApplication12-13-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ArticoloUsatoFacade() {
        super(ArticoloUsato.class);
    }
    
    /**
     * Cerca l'articolo usato nel Database
     *
     * @param art articolo usato da cercare
     * @return true se l'articolo usato e' presente nel Database, false altrimenti
     */
    @Override
    public boolean articoloEsistente(ArticoloUsato art){
        DateFormat data = new SimpleDateFormat("yyyy-MM-dd");
        String dataInsArt = data.format(art.getData());
        return !(em.createQuery("select object(a) from ArticoloUsato as a where UPPER(a.nome) = '" + art.getNome().toString().toUpperCase() + "' and UPPER(a.data) ='" + dataInsArt +"'" ,ArticoloUsato.class).getResultList().isEmpty());
    }
     
    /**
     * Cerca l'articolo usato con uno specifico id nel Database
     *
     * @param id identificativo dell'articolo usato da cercare
     * @return ArticoloUsato l'articolo usato con identificativo id, null altrimenti
     */
    @Override
    public ArticoloUsato getArticoloUsato(Long id){
        String idString = id.toString();
        return em.createQuery("select object(a) from ArticoloUsato a where a.id ='" +idString + "'",ArticoloUsato.class).getSingleResult();
     }
      
    /**
     * Ricerca gli articoli usati il cui nome matcha con il parametro articolo nel Database
     *
     * @param articolo sottostringa di ricerca
     * @return List<ArticoloUsato> lista degli articoli usati che soddisfano la ricerca, altrimenti restituisce una lista vuota 
     */
     @Override
     public List<ArticoloUsato> findArticoliUsati(String articolo){
       return em.createQuery("select object(a) from ArticoloUsato as a where UPPER(a.nome) LIKE '%" + articolo.toUpperCase() + "%' AND a.confermato=1",ArticoloUsato.class).getResultList(); 
     }

     /**
     * Cerca tutti gli articoli usati confermati nel Database
     * @return List<ArticoloUsato> lista degli articoli usati presenti nel Database, altrimenti restituisce una lista vuota  
     */
     @Override
     public List<ArticoloUsato> getArticoliUsati(){
         List<ArticoloUsato> artUsati=em.createQuery("select object(a) from ArticoloUsato as a WHERE a.confermato=1",ArticoloUsato.class).getResultList();
         if(!artUsati.isEmpty())return artUsati;
         return new LinkedList<ArticoloUsato>();
     }
     
     /**
     * Cerca tutti gli articoli usati del Database di uno specifico utente
     *
     * @param u Utente proprietario degli articoli
     * @return List<ArticoloUsato> lista degli articoli usati presenti nel Database il cui proprietario è l'utente u, altrimenti restituisce una lista vuota 
     */
     @Override 
     public List<ArticoloUsato> getArticoliUsati(Utente u){
         return em.createNativeQuery("SELECT a.id,a.commento,a.confermato,a.descrizionegenerale,a.nome,a.prezzo,a.utente_id FROM ArticoloUsato a INNER JOIN Utente u ON a.utente_id = u.id where u.id="+ u.getId()+ " AND a.confermato=1",ArticoloUsato.class).getResultList();
     }
     
     /**
     * Cerca tutti gli articoli usati del Database che non sono ancora stati confermati da un amministratore
     *
     * @return List<ArticoloUsato> lista degli articoli usati ancora da confermare presenti nel Database, se non sono 
     * presenti restituisce una lista vuota 
     */
     @Override 
     public List<ArticoloUsato> getArticoliUsatiDaConfermare(){
         List<ArticoloUsato> artUsati= em.createNativeQuery("SELECT a.* FROM ArticoloUsato a WHERE a.confermato=0",ArticoloUsato.class).getResultList();
         if(!artUsati.isEmpty())return artUsati;
         return new LinkedList<ArticoloUsato>();
     }
}
